package org.dromara.tearoom.service;

import cn.hutool.core.map.MapUtil;
import org.dromara.common.mybatis.core.page.PageQuery;
import org.dromara.common.mybatis.core.page.TableDataInfo;
import org.dromara.tearoom.domain.bo.TerCouponBo;
import org.dromara.tearoom.domain.enums.CouponTakeTypeEnum;
import org.dromara.tearoom.domain.vo.TerCouponTemplateVo;
import org.dromara.tearoom.domain.vo.TerCouponVo;
import org.dromara.tearoom.domain.vo.TerOrderVo;

import java.util.*;

/**
 * 优惠劵Service接口
 *
 * @author ckj
 * @date 2025-04-23
 */
public interface ITerCouponService {

    /**
     * 查询优惠劵
     *
     * @param id 主键
     * @return 优惠劵
     */
    TerCouponVo queryById(Long id);

    /**
     * 分页查询优惠劵列表
     *
     * @param bo        查询条件
     * @param pageQuery 分页参数
     * @return 优惠劵分页列表
     */
    TableDataInfo<TerCouponVo> queryPageList(TerCouponBo bo, PageQuery pageQuery);

    /**
     * 查询符合条件的优惠劵列表
     *
     * @param bo 查询条件
     * @return 优惠劵列表
     */
    List<TerCouponVo> queryList(TerCouponBo bo);

    /**
     * 新增优惠劵
     *
     * @param bo 优惠劵
     * @return 是否新增成功
     */
    Boolean insertByBo(TerCouponBo bo);

    /**
     * 修改优惠劵
     *
     * @param bo 优惠劵
     * @return 是否修改成功
     */
    Boolean updateByBo(TerCouponBo bo);

    /**
     * 校验并批量删除优惠劵信息
     *
     * @param ids     待删除的主键集合
     * @param isValid 是否进行有效性校验
     * @return 是否删除成功
     */
    Boolean deleteWithValidByIds(Collection<Long> ids, Boolean isValid);


    /**
     * 【管理员】给用户发送优惠券
     *
     * @param templateId 优惠券模板编号
     * @param userIds    用户编号列表
     * @return key: userId, value: 优惠券编号列表
     */
    default Map<Long, List<Long>> takeCouponByAdmin(Long templateId, Set<Long> userIds,String remark) {
        return takeCoupon(templateId, userIds, CouponTakeTypeEnum.ADMIN,remark,null);
    }


    /**
     * 第三方平台(抖音、美团等)给用户发送优惠券
     * @param templateId 模版ID
     * @param groupBuyId  团购ID
     * @param userIds    用户编号列表
     * @return key: userId, value: 优惠券编号列表
     */
    Map<Long, List<Long>> takeCouponByGroupBy(Long templateId,Long groupBuyId, Set<Long> userIds,String remark);

    /**
     * 领取优惠券
     *
     * @param templateId 优惠券模板编号
     * @param userIds    用户编号列表
     * @param takeType   领取方式
     * @return key: userId, value: 优惠券编号列表
     */
    Map<Long, List<Long>> takeCoupon(Long templateId, Set<Long> userIds, CouponTakeTypeEnum takeType,String remark,Long groupById);


    /**
     * 使用优惠劵
     *
     * @param id      优惠劵编号
     * @param userId  用户编号
     * @param orderId 订单编号
     */
    void useCoupon(Long id, Long userId, String orderId);


    /**
     * 计算订单价格
     * @param id
     * @param userId
     * @param orderId
     * @return
     */
    TerOrderVo calculatePrice(Long id, Long userId, String orderId);

    /**
     * 过期优惠券
     *
     * @return 过期数量
     */
    int expireCoupon();


    /**
     * 获取用户是否可以领取优惠券
     *
     * @param userId    用户编号
     * @param templates 优惠券列表
     * @return 是否可以领取
     */
    Map<Long, Boolean> getUserCanCanTakeMap(Long userId, List<TerCouponTemplateVo> templates);


    /**
     * 获取用户是否拥有优惠券
     *
     * @param userId    用户编号
     * @param templates 优惠券列表
     * @return 是否可以领取
     */
    Map<Long, Boolean> getUserIsHaveMap(Long userId, List<TerCouponTemplateVo> templates);


    /**
     * 统计会员领取优惠券的数量
     *
     * @param templateIds 优惠券模板编号列表
     * @param userId      用户编号
     * @return 领取优惠券的数量
     */
    Map<Long, Integer> getTakeCountMapByTemplateIds(Collection<Long> templateIds, Long userId);


    /**
     * 获取会员领取指定优惠券的数量
     *
     * @param templateId 优惠券模板编号
     * @param userId     用户编号
     * @return 领取优惠券的数量
     */
    default Integer getTakeCount(Long templateId, Long userId) {
        Map<Long, Integer> map = getTakeCountMapByTemplateIds(Collections.singleton(templateId), userId);
        return MapUtil.getInt(map, templateId, 0);
    }

    Integer getCouponPrice(TerCouponVo coupon, Integer totalPrice);
}
